<?php

class AdmListadoPorEntidad extends TPage {
//<editor-fold defaultstate="collapsed" desc="Constantes">
  const SESION_DATOS = "arr";
  const CAMPO_ORDEN_DATAGRID = "CampoOrdenDataGrid";
  //funciones pagina
  const FUNCION_VER = "Ver";

//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Metodos Privados">
  /**
   * obtiene los registros desde la base de datos
   * @author VSR, 01/01/2011
   */
  private function obtenerDatos(){
    try {
      $oUsuario = Utilidades::obtenerSessionPorNombre(Usuario::NOMBRE_ENTIDAD);
      //obtiene valores de los controles
      $idUsuario = $oUsuario->getId();
      $entidad = $this->txtEntidad->Value;
      $tipoArchivo = Utilidades::isNull($this->ddlTipoArchivo->obtenerSelectedValue(), "-1");

      //obtiene listado
      $arr = Archivo::obtenerListadoPorEntidad($idUsuario, $entidad, $tipoArchivo, Archivo::SIN_ENTIDAD);

      //guarda el resultado en session
      Utilidades::grabarSessionPorNombre(self::SESION_DATOS, $arr);
    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

  /**
   * actualiza los controles de la pagina segun los datos obtenidos
   * @author VSR, 01/01/2011
   */
  private function actualizaInterfaz(){
    $totalRegistros = 0;
    try {
      $entidad = $this->txtEntidad->Value;
      $arr = Utilidades::obtenerSessionPorNombre(self::SESION_DATOS);
      if(is_null($arr)) {
        $totalRegistros = 0;
      } else {
        $totalRegistros = count($arr);
      }

      if($totalRegistros > 0) {
        $this->pnlHolderGrilla->Visible = true;
        //carga la grilla a utilizar
        $this->dgArchivos->Visible = true;
        $this->dgArchivos->DataSource = $arr;
        $this->dgArchivos->dataBind();
        $this->hBotonActualizar->Visible = true;
        Utilidades::configurarPaginadorDataGrid($this->dgArchivos->PagerStyle, $totalRegistros, $this->dgArchivos->PageSize);
        Utilidades::mostrarTotalRegistrosGrilla($totalRegistros, $this->lblTotalRegistros);
      } else {
        $this->pnlHolderGrilla->Visible = false;
        $this->pnlMensajeUsuario->Visible = true;
        $textoMensaje = "No se encontraron registros";
        Utilidades::setPanelMensajeUsuario($this->pnlMensajeUsuario, $textoMensaje, "50%", Utilidades::ESTILO_MENSAJE_ADVERTENCIA);
        //oculta la grilla
        $this->dgArchivos->Visible = false;
        $this->hBotonActualizar->Visible = false;
      }
      $this->lblEntidad->Text = $entidad;

    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

  /**
   * inicializa algunos controles cuando se carga por primera vez la pagina
   * @param <type> $isPostBack
   * @author VSR, 01/01/2011
   */
  private function inicializaControles($isPostBack){
    try {
      $registrosPorPagina = $this->txtFiltroRegistrosPorPagina->Text;
      $entidad = $this->txtEntidad->Value;

      //-- inicializacion de controles que dependen del postBack --
      if(!$isPostBack){
        if($registrosPorPagina == "" || $registrosPorPagina == "0") {
          $registrosPorPagina = Utilidades::obtenerRegistrosPorPaginaDefault($this->Application);
          $this->txtFiltroRegistrosPorPagina->Text = $registrosPorPagina;
        }
        //asigna total de registros por pagina
        $this->dgArchivos->PageSize = $registrosPorPagina;
        //Muestra la primera pagina del paginador
        $this->dgArchivos->CurrentPageIndex = 0;
        $this->ddlEntidad->asignarSelectedValue($entidad);
      }

      //-- inicializacion de controles que NO dependen del postBack --
      if($registrosPorPagina == "") {
        $this->txtFiltroRegistrosPorPagina->Text = Utilidades::obtenerRegistrosPorPaginaDefault($this->Application);
      }
      $this->btnFiltrar->Attributes->Add("onclick", "return(validarFormularioListadoArchivos())");
      $this->btnActualizar->Attributes->Add("onclick", "return(validarActualizacionArchivos())");

      //verifica los permisos sobre los controles
      $this->verificarPermisos();

    } catch (Exception $e) {
      throw new Exception($e->getMessage());
    }
  }

  /**
   * verifica los permisos sobre los controles
   * @author VSR, 01/01/2011
   */
  private function verificarPermisos(){
    $paginaActual = Utilidades::obtenerNombrePaginaActual($this);
    $this->pnlContenido->Visible = Utilidades::tienePermiso($paginaActual, self::FUNCION_VER);
    if(!$this->pnlContenido->Visible){
      $this->pnlMensajeAcceso->Visible = true;
      Utilidades::setPanelMensajeUsuario($this->pnlMensajeAcceso, "No tiene permiso para ver esta p&aacute;gina", "50%", Utilidades::ESTILO_MENSAJE_ERROR);
    }
  }

  /**
   * actualiza los archivos
   * @return string
   * @author VSR, 27/04/2011
   */
  private function actualizaArchivos() {
    $msgError = "";
    $status = "";
    try {
      $entidad = $this->txtEntidad->Value;
      foreach($this->dgArchivos->Items as $item) {
        if($item->ItemType==='Item' || $item->ItemType==='AlternatingItem') {
          //obtiene controles
          $txtIdArchivo = $item->findControl("txtIdArchivo");
          $txtIdRegistro = $item->findControl("txtIdRegistro");
          //$txtIdArchivoRegistro = $item->findControl("txtIdArchivoRegistro");
          //$txtDescripcion = $item->findControl("txtDescripcion");
          $chkEliminar = $item->findControl("chkEliminar");

          //verfica si tiene que eliminar el registro, sino actualiza la descripcion
          if ($chkEliminar->Checked) {
            $idArchivo = $txtIdArchivo->Value;
            $idRegistro = $txtIdRegistro->Value;
            $status = Archivo::eliminarArchivoEnBDPorId($txtIdArchivo->Value);
            if($status > 0){
              if ($entidad == Archivo::SIN_ENTIDAD) {
                $directorioArchivoRepositorio = Archivo::RUTA_REPOSITORIO."/".$idArchivo;
              } else {
                $directorioArchivoRepositorio = Archivo::RUTA_REPOSITORIO."/".$entidad."/reg".$idRegistro."/".$idArchivo;
              }
              //elimina el archivo del repositorio
              Archivo::eliminarDirectorio($directorioArchivoRepositorio);
            }
          } else {
            //$status = Archivo::actualizarDescripcion($txtIdArchivoRegistro->Value, $txtDescripcion->Text);
          }
          //si hay un error entonces termina la funcion
          if ($status == Sistema::CODIGO_SQL_ERROR) {
            $msgError = "No se pudo actualizar los archivos.<br />";
            break;
          }
        }
      }
    } catch (Exception $e) {
      $msgError = "No se pudo actualizar los archivos.<br />";
    }
    return $msgError;
  }

  /**
   * muestra mensaje al usuario
   * @author VSR, 01/01/2011
   */
  private function mostrarMensajeUsuario(){
    try {
      $mensaje = Utilidades::isNull(Utilidades::obtenerSessionPorNombre("msg"),"");
      $baseUrl = $this->Page->Theme->BaseUrl;

      //asigna mensaje al panel
      $this->pnlMensajeUsuario->Visible = true;

      //dependiendo de la marca especial que tenga el sistema es como se muestra el mensaje al usuario
      if(strpos($mensaje, "{#ACTUALIZADO}") === 0) {
        $mensaje = str_replace("{#ACTUALIZADO}", "", $mensaje);
        Utilidades::setPanelMensajeUsuarioConBotonCerrar($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_EXITO, $baseUrl);
      } elseif (strpos($mensaje, "{#ERROR}") === 0) {
        $mensaje = str_replace("{#ERROR}", "", $mensaje);
        Utilidades::setPanelMensajeUsuario($this->pnlMensajeUsuario, $mensaje, "100%", Utilidades::ESTILO_MENSAJE_ERROR);
      } else {
        $this->pnlMensajeUsuario->Visible = false;
      }
      Utilidades::grabarSessionPorNombre("msg", "");
    } catch (Exception $e) {
      $this->pnlMensajeUsuario->Visible = false;
    }

  }

//</editor-fold>

//<editor-fold defaultstate="collapsed" desc="Eventos Controles">
  public function onLoad($param) {
    parent::onLoad($param);

    try {
      $argCrypt = $this->Request["a"];
      $textoDesencriptado = Criptografia::desencriptar($argCrypt);

      if (!$this->Page->IsPostBack) {
        if(!Utilidades::isNullOrEmpty($textoDesencriptado)) {
          $arr = json_decode($textoDesencriptado);
          //obtiene los datos
          $entidad = $arr->Entidad;
          $this->txtEntidad->Value = $entidad;
          $this->pnlMensajeAcceso->Visible = false;
          $this->pnlContenido->Visible = true;
          $this->hBotonActualizar->Visible = true;
          $this->obtenerDatos();
          $this->inicializaControles($this->IsPostBack);
          $this->actualizaInterfaz();
          $this->mostrarMensajeUsuario();
        } else {
          $this->hBotonActualizar->Visible = false;
          $this->pnlContenido->Visible = false;
          $this->pnlMensajeAcceso->Visible = true;
          Utilidades::setPanelMensajeUsuario($this->pnlMensajeAcceso, "El argumento recibido no es válido", "50%", Utilidades::ESTILO_MENSAJE_ERROR);
        }
      }
    } catch (Exception $e) {
      $this->hBotonActualizar->Visible = false;
      $this->pnlContenido->Visible = false;
      $this->pnlMensajeAcceso->Visible = true;
      Utilidades::setPanelMensajeUsuario($this->pnlMensajeAcceso, "El argumento recibido no es válido", "50%", Utilidades::ESTILO_MENSAJE_ERROR);
    }
    
  }

  public function btnFiltrarClick($sender, $param){
    $pageSize = trim($this->txtFiltroRegistrosPorPagina->Text);
    if($pageSize == "" || $pageSize == "0") {
      $pageSize = Utilidades::obtenerRegistrosPorPaginaDefault($this->Application);
      $this->txtFiltroRegistrosPorPagina->Text = $pageSize;
    }
    //asigna total de registros por pagina
    $this->dgArchivos->PageSize = $pageSize;
    //Muestra la primera pagina del paginador
    $this->dgArchivos->CurrentPageIndex = 0;
    $this->txtEntidad->Value = $this->ddlEntidad->obtenerSelectedValue();
    $this->obtenerDatos();
    $this->actualizaInterfaz();
  }

  public function onSortDataGrid($sender, $param) {
    $arr = Utilidades::obtenerSessionPorNombre(self::SESION_DATOS);
    $campoOrdenActualDataGrid = Utilidades::isNull(Utilidades::obtenerSessionPorNombre(self::CAMPO_ORDEN_DATAGRID),"");
    //obtiene el nuevo orden del arreglo
    $arr = Utilidades::obtenerSortArray($arr, $campoOrdenActualDataGrid, $param->SortExpression);
    //graba el orden actual
    Utilidades::grabarSessionPorNombre(self::CAMPO_ORDEN_DATAGRID, $campoOrdenActualDataGrid);
    //graba el array ordenado
    Utilidades::grabarSessionPorNombre(self::SESION_DATOS, $arr);
    //asigna
    $this->actualizaInterfaz();
  }

  public function onChangePageDataGrid($sender,$param) {
    $this->dgArchivos->CurrentPageIndex = $param->NewPageIndex;
    $this->actualizaInterfaz();
  }

  public function onPagerCreatedDataGrid($sender,$param) {
    $param->Pager->Controls->insertAt(0,"<span class=\"cssPaginadorNormal\">P&aacute;gina:</span> ");
  }

  public function onDataBoundDataGrid($sender, $param){
    $paginaActual = Utilidades::obtenerNombrePaginaActual($this);
    $indicePrimeraFila = Utilidades::obtenerIndicePrimeraFilaGrilla($this->dgArchivos);
    $queryString = "";
    $themeBaseUrl = $this->Page->Theme->BaseUrl;
    $entidad = $this->txtEntidad->Value;
    $item = $param->Item;

    if($item->ItemType==='Item' || $item->ItemType==='AlternatingItem')
    {
      $txtNombreArchivo = $item->findControl("txtNombreArchivo");
      $txtExtension = $item->findControl("txtExtension");
      $txtIdRegistro = $item->findControl("txtIdRegistro");
      $txtContentType = $item->findControl("txtContentType");
      $txtTamano = $item->findControl("txtTamano");
      $txtIdArchivo = $item->findControl("txtIdArchivo");
      $lblNombreArchivo = $item->findControl("lblNombreArchivo");
      $lblIdRegistro = $item->findControl("lblIdRegistro");
      $lblTotalTamano = $item->findControl("lblTotalTamano");
      $chkEliminar = $item->findControl("chkEliminar");

      //formatea valores
      $totalTamano = Utilidades::convertirUnidadMedidaArchivo($txtTamano->Value, true);

      //encripta el id
      if ($entidad != Archivo::SIN_ENTIDAD) {
        $queryString = "{";
        $queryString .= " \"IdRegistro\":\"".$txtIdRegistro->Value."\"";
        $queryString .= ",\"Entidad\":\"".$entidad."\"";
        $queryString .= ",\"IdArchivo\":\"".$txtIdArchivo->Value."\"";
        $queryString .= ",\"NombreArchivo\":\"".$txtNombreArchivo->Value."\"";
        $queryString .= ",\"ContentType\":\"".$txtContentType->Value."\"";
        $queryString .= ",\"Descargable\":\"1\"";
        $queryString .= "}";
        $queryString = Criptografia::encriptarURL($queryString);
      }

      //asigna valores
      $icono = Utilidades::obtenerRutaIconoTipoArchivo($txtExtension->Value, $txtContentType->Value, $themeBaseUrl);
      if ($entidad == Archivo::SIN_ENTIDAD) {
        $lblNombreArchivo->Text = $icono."&nbsp;&nbsp;".$txtNombreArchivo->Value;
      } else {
        $lblNombreArchivo->Text = $icono."&nbsp;&nbsp;<a href=\"index.php?page=Archivo.Visualizador&a=".$queryString."\">".$txtNombreArchivo->Value."</a>";
      }

      $icono = Utilidades::obtenerIconoTamanoArchivo($txtTamano->Value, "Archivo", $themeBaseUrl);
      $lblTotalTamano->Text = ($entidad == Archivo::SIN_ENTIDAD) ? "&nbsp;" : $icono."&nbsp;".$totalTamano;
      $lblIdRegistro->Text = ($entidad == Archivo::SIN_ENTIDAD) ? "&nbsp;" : $txtIdRegistro->Value;
      $chkEliminar->Attributes->Add("onclick", "destacarFilaTabla('".$this->dgArchivos->ClientID."',this,'".Utilidades::COLOR_FONDO_FILA_NORMAL_GRIS_DATAGRID."','".Utilidades::COLOR_FONDO_FILA_DESTACADO_AMARILLO_DATAGRID."',false)");

      //limpia controles
      $txtNombreArchivo->Value = "";
      $txtExtension->Value = "";
      $txtContentType->Value = "";
      $txtTamano->Value = "";

      //asigna indice de la fila
      $indiceFila = $indicePrimeraFila + $item->ItemIndex;
      //asigna valor del indice de la fila al control
      Utilidades::setControlIndiceFila($item, "lblIndiceFila", $indiceFila);
    }
  }

  public function btnActualizarClick($sender, $param){
    $msgError = "";
    $entidad = $this->txtEntidad->Value;
    $msgError .= $this->actualizaArchivos();

    if (Utilidades::isNullOrEmpty($msgError)) {
      $msgError = "{#ACTUALIZADO}La actualizaci&oacute;n fue realizada satisfactoriamente";
    } else {
      $msgError = "{#ERROR}".$msgError;
    }

    //construye queryString
    $queryString = "{";
    $queryString .= " \"Entidad\":\"".$entidad."\"";
    $queryString .= "}";
    $queryString = Criptografia::encriptarURL($queryString);
    Utilidades::grabarSessionPorNombre("msg", $msgError);
    //asigna valores
    $this->Response->redirect($this->Service->constructUrl("Archivo.AdmListadoPorEntidad")."&a=".$queryString);
  }

  public function btnVolverClick($sender, $param){
    $this->Response->redirect($this->Service->constructUrl("Archivo.AdmListado"));
  }


//</editor-fold>

}

?>
